/*
Symbol.iterator 迭代器 和 生成器 for of

支持遍历大部分类型迭代器 arr nodeList argumetns set map 等
*/
// 1.生成器 用法一样（迭代器）
function* gen() {
    yield Promise.resolve('小李'); // yield 后面可以跟同步或者异步的表达式
    yield '大李';
    yield '超大李';
    yield '超超大李';
}
const man = gen();
console.log(man.next()); // { value: Promise { '小李' }, done: false }
console.log(man.next()); // { value: '大李', done: false }
console.log(man.next()); // { value: '超大李', done: false }
console.log(man.next()); // { value: '超超大李', done: false }
console.log(man.next()); // { value: undefined, done: true }
// 2.迭代器
// 3.set map  weakSet weakMap
let set = new Set([1, 1, 2, 2, 3, 3]); // set 自动去重
console.log(set);
let map = new Map([['name', '小明'], ['age', '18']]);
let ArrSet = [1, 2, 3, 4, 5];
map.set(ArrSet, "小李"); // 数组作为键名进行存储
console.log(map.get(ArrSet));
function args() {
    console.log(arguments); // arguments 是一个伪数组，可以遍历
}
// let listSet = document.querySelectorAll("div")  // nodeList 伪数组
/* listSet.forEach((item) => {
  console.log(item)
}) */
// 核心代码
/* const eachSet = (value:any) => {
  let It: any = value[Symbol.iterator]()
  let next: any = { done: false }
  while(!next.done) {
    next = It.next()
    if(!next.done) {
      console.log(next.value)
    }
  }
}

eachSet([1,2,3,4,5,6,7,8,9,10])
eachSet(map) */
// 5.迭代器的语法糖 for of
/* for (let value of set) {
  console.log(value)
} */
// 6.for of 对象不能用
/* for (let value of {name: 1}) {
  console.log(value)
} */
// 7.解构 底层原理也是去调用  iterator
let arrSet = [1, 2, 3];
console.log(arrSet);
let copySet = [...arrSet];
console.log(copySet);
// 8.对象支持  for of
let objSet = {
    name: '小明',
    age: 18,
    max: 50,
    current: 0,
    [Symbol.iterator]() {
        return {
            max: this.max,
            current: this.current,
            next() {
                if (this.current === this.max) {
                    return {
                        value: undefined,
                        done: true
                    };
                }
                else {
                    this.current++;
                    return {
                        value: this.current,
                        done: false
                    };
                }
            }
        };
    }
};
for (let value of objSet) {
    console.log(value);
}
